using System;
using System.Collections.Generic;
using System.Linq;
using M0;
using M1;
using UnityEngine;
using UnityEngine.UI;

public class 选择形象View : BaseWindow
{
    [SerializeField] private 组件皮肤头像Icon baseIcon;
    [SerializeField] private ScrollRect 头发Rect;
    [SerializeField] private ScrollRect 上衣Rect;
    [SerializeField] private ScrollRect 裤子Rect;
    [SerializeField] private ScrollRect 装饰Rect;
    [SerializeField] private Transform 头发Content;
    [SerializeField] private Transform 上衣Content;
    [SerializeField] private Transform 裤子Content;
    [SerializeField] private Transform 装饰Content;
    [SerializeField] private GameObject 全屏掩码;

    private const string 缓存Key = "皮肤头像缓存";
    private List<组件皮肤头像Icon> Icons = new List<组件皮肤头像Icon>();
    private List<组件皮肤头像Icon> Icons上衣 = new List<组件皮肤头像Icon>();
    private List<组件皮肤头像Icon> Icons裤子 = new List<组件皮肤头像Icon>();
    private List<组件皮肤头像Icon> Icons装饰 = new List<组件皮肤头像Icon>();

    private int 模型数量 = 3;
    private 人 主角;
    private 人 男主;
    private 人 女主;

    private bool cur女主 = false;
    private Vector3 原地;
    private Vector3 Next;
    private Vector3 Last;

    private void Awake()
    {
        全皮肤 = 皮肤数据.Instance.GetData();
        
        var 主角2 = GameObject.FindWithTag("Player");
        if (主角2 != null)
        {
            主角 = 主角2.GetComponent<人>();
        }

        Transform p = 主角.transform.parent;
        男主 = Resource加载.Instance.Load<人>("Prefab/男主");
        女主 = Resource加载.Instance.Load<人>("Prefab/女主");
        男主.Show名片(false);
        女主.Show名片(false);
        var 角度 = 主角.transform.localEulerAngles;
        男主.transform.localEulerAngles = 角度;
        女主.transform.localEulerAngles = 角度;
        
        var tran = 主角.transform;
        var tranPos = tran.position;
        原地 = tranPos;
        Next = tranPos+tran.forward*3;
        Last = tranPos+tran.forward*-3;
        
        M.Event.AddEvent<皮肤Data,int>(typeof(组件皮肤头像Icon).ToString(),选中皮肤);

        var 装饰s = 二合小镇.Instance.Get使用的装饰();
        foreach (var VARIABLE in Enum.GetValues(typeof(皮肤装饰)))
        {
            皮肤装饰 装饰 = (皮肤装饰)VARIABLE;
            int 参数 = 装饰s.Contains(装饰)?1:0;
            男主.选装饰(装饰.GetHashCode(),参数);
            女主.选装饰(装饰.GetHashCode(),参数);
        }
        foreach (var VARIABLE in 装饰s)
        {
            男主.选装饰(VARIABLE.GetHashCode(),1);
            女主.选装饰(VARIABLE.GetHashCode(),1);
        }
    }

    public override void CloseWindow()
    {
        base.CloseWindow();
        男主.删除();
        女主.删除();
        主角.gameObject.SetActive(true);
    }

    private void 选中皮肤(皮肤Data data,int 参数)
    {
        if(data == null) return;
        
        switch (data.Type)
        {
            case 皮肤部位.头发 :
                if (data.Sex == 0)
                {
                    女主.选头发(data.Mat);
                }
                else
                {
                    男主.选头发(data.Mat);
                }
                break;
            case 皮肤部位.上衣 :
                if (data.Sex == 0)
                {
                    女主.选上衣(data.Mat);
                }
                else
                {
                    男主.选上衣(data.Mat);
                }
                break;
            case 皮肤部位.裤子 :
                if (data.Sex == 0)
                {
                    女主.选裤子(data.Mat);
                }
                else
                {
                    男主.选裤子(data.Mat);
                }
                break;
            case 皮肤部位.装饰:
                // int next = 参数 == 0 ? 1 : 0;
                
                女主.选装饰(data.Index, 参数);
                男主.选装饰(data.Index, 参数);
                break;
        }

        二合小镇.Instance.更新皮肤(data,参数);
    }

    [ContextMenu("测试跳转")]
    public void Test跳转()
    {
        M.ScollItem跳转显示(头发Rect,Icons[5].GetComponent<RectTransform>(),-1,0.5f);
    }

    public void 选择性别()
    {
        二合小镇.Instance.保存性别(cur女主);
        CloseWindow();
    }

    private void OnDestroy()
    {
        男主.删除();
        女主.删除();
        M.Event.RemoveEvent<皮肤Data,int>(typeof(组件皮肤头像Icon).ToString(),选中皮肤);
    }

    private List<皮肤Data> 全皮肤;

    // private void OnEnable()
    // {
    //     
    // }

    private void 匹配性别的皮肤(bool girl)
    {
        var 部分皮肤 = 全皮肤.Where(w => { return (girl && w.Sex == 0) || (!girl && w.Sex == 1) || w.Sex ==-1; });

        回收皮肤Icons();
        初始化部分皮肤(部分皮肤, 皮肤部位.头发);
        初始化部分皮肤(部分皮肤, 皮肤部位.上衣);
        初始化部分皮肤(部分皮肤, 皮肤部位.裤子);
        初始化部分皮肤(部分皮肤, 皮肤部位.装饰);
    }

    void 初始化部分皮肤(IEnumerable<皮肤Data> 部分皮肤, 皮肤部位 type)
    {
        var 头发 = 部分皮肤.Where(w => w.Type == type);
        int index = 0;
        List<组件皮肤头像Icon> 暂存 = new List<组件皮肤头像Icon>();
        Transform content=null;
        switch (type)
        {
            case 皮肤部位.头发:
                暂存 = Icons;
                content = 头发Content;
                break;
            case 皮肤部位.上衣:
                暂存 = Icons上衣;
                content = 上衣Content;
                break;
            case 皮肤部位.裤子:
                暂存 = Icons裤子;
                content = 裤子Content;
                break;
            case 皮肤部位.装饰:
                暂存 = Icons装饰;
                content = 装饰Content;
                break;
        }
        foreach (var VARIABLE in 头发)
        {
            var item = Mono缓存池.Instance.F创建(缓存Key, baseIcon, content);
            item.SetUp(VARIABLE,VARIABLE.Index);
            暂存.Add(item);
        }
    }


    void 回收皮肤Icons()
    {
        foreach (var VARIABLE in Icons)
        {
            Mono缓存池.Instance.F回收(缓存Key,VARIABLE);
        }
        foreach (var VARIABLE in Icons上衣)
        {
            Mono缓存池.Instance.F回收(缓存Key,VARIABLE);
        }
        foreach (var VARIABLE in Icons裤子)
        {
            Mono缓存池.Instance.F回收(缓存Key,VARIABLE);
        }
        foreach (var VARIABLE in Icons装饰)
        {
            Mono缓存池.Instance.F回收(缓存Key,VARIABLE);
        }
        Icons.Clear();
        Icons上衣.Clear();
        Icons裤子.Clear();
        Icons装饰.Clear();
    }

    public override void OpenWindow()
    {
        base.OpenWindow();
        主角.gameObject.SetActive(false);
        var tran = 主角.transform;

        var cur性别 = 二合小镇.Instance.GetCur性别();
        cur女主 = cur性别 == 0;
        if (cur性别==0)
        {
            男主.transform.position = Last;
            女主.transform.position = 原地;
        }
        else
        {
            男主.transform.position = 原地;
            女主.transform.position = Last;
        }
        
        匹配性别的皮肤(cur女主);
    }

    public void 选男主()
    {
        if (cur女主)
        {
            全屏掩码.SetActive(true);
            女主.AI寻路(Next);
            男主.transform.position = Last;
            男主.AI寻路(原地, () =>
            {
                男主.转身(主角.transform.rotation);
                cur女主 = false;
                全屏掩码.SetActive(false);
            });
            匹配性别的皮肤(false);
        }
    }

    public void 选女主()
    {
        if (!cur女主)
        {
            全屏掩码.SetActive(true);
            男主.AI寻路(Next);
            女主.transform.position = Last;
            女主.AI寻路(原地, () =>
            {
                女主.转身(主角.transform.rotation);
                cur女主 = true;
                全屏掩码.SetActive(false);
            });
            匹配性别的皮肤(true);
        }
    }
}
